/**
 * 用户认证路由模块 (v1.0.0)
 * 所属业务域：用户中心
 * 模块职责边界：
 * - 仅处理用户注册/登录相关HTTP请求路由分发
 * - 实现请求数据的前置验证与清洗
 * - 对接用户认证业务逻辑层，不直接操作数据层
 * 依赖模块：
 * - Express框架：提供路由与中间件基础能力
 * - Joi验证体系：保障请求数据合法性
 * - 用户业务逻辑层(router_handler/user)：实现核心认证逻辑
 */

// 导入Express框架
// 技术选型依据：企业级应用中Express的轻量级特性适合构建微服务架构
// 生产环境配置要点：
// 1. 需配合express-rate-limit实现接口限流（建议单IP 1分钟内最多10次注册请求）
// 2. 通过compression中间件启用响应压缩，降低带宽消耗
// 3. 结合helmet设置安全相关HTTP头（如X-XSS-Protection、Content-Security-Policy）
const express = require('express');

// 导入@escook/express-joi中间件
// 功能定位：请求数据验证的横切关注点实现
// 企业级实践：
// - 验证失败时自动返回标准化错误（{status:1, message:"具体错误信息"}）
// - 与全局错误处理中间件联动，确保错误响应格式一致
// - 版本兼容性：需锁定依赖版本（如"@escook/express-joi": "^1.1.1"），避免自动升级导致验证逻辑异常
const expressJoi = require('@escook/express-joi');

// 导入用户注册和登录的数据验证规则
// 规则设计规范：
// 1. 基础约束：username(3-16位字母数字下划线)、password(6-20位混合字符)
// 2. 安全强化：密码需包含大小写字母+数字+特殊符号（生产环境建议）
// 3. 扩展性：预留mobile/email字段验证规则位置，支持多因素认证扩展
// 4. 维护性：所有验证规则集中管理，便于统一修改验证策略
const { reg_login_schema } = require('../schema/user');

// 创建路由实例
// 路由设计模式：
// - 采用RESTful风格：POST方法对应资源创建（注册/登录本质是创建会话资源）
// - 路径命名规范：使用小写字母+连字符，避免动词（如/login而非/getLogin）
// - 版本控制预留：当前挂载在/api，未来可通过/api/v2实现版本迭代
const router = express.Router();

// 导入用户相关的路由处理函数模块
// 分层架构体现：
// - 路由层（当前模块）：负责HTTP协议相关处理（路径、方法、参数解析）
// - 业务逻辑层（router_handler/user）：实现认证核心逻辑（用户校验、Token生成）
// - 数据访问层（db/index）：处理数据库交互
// 优势：各层可独立测试、替换，符合"高内聚低耦合"设计原则
const userHandler = require('../router_handler/user');

/**
 * 用户注册接口
 * @api {post} /api/reguser 注册新用户
 * @apiGroup UserAuth
 * @apiVersion 1.0.0
 * @apiParam {String} username 用户名（3-16位字母数字下划线）
 * @apiParam {String} password 密码（6-20位，建议包含大小写字母、数字、特殊符号）
 * @apiSuccess {Number} status 状态码（0-成功，1-失败）
 * @apiSuccess {String} message 响应信息
 * @apiError (Error 400) {Number} status 1
 * @apiError (Error 400) {String} message 用户名已存在/数据格式错误
 * @apiError (Error 500) {Number} status 1
 * @apiError (Error 500) {String} message 服务器内部错误
 * 
 * 安全防护措施：
 * 1. 输入验证：防止SQL注入（通过Joi验证+参数化查询）
 * 2. 密码策略：强制加密存储（bcrypt算法，10轮盐值）
 * 3. 防重放：后续可添加nonce+timestamp机制防止请求重放
 * 4. 监控告警：失败次数超过阈值（如5次/分钟）触发安全告警
 */
router.post('/reguser', 
  // 数据验证中间件：优先级高于业务逻辑，提前拦截无效请求
  expressJoi(reg_login_schema), 
  // 业务处理函数：专注实现注册逻辑，与HTTP协议解耦
  userHandler.reguser
);

/**
 * 用户登录接口
 * @api {post} /api/login 用户登录
 * @apiGroup UserAuth
 * @apiVersion 1.0.0
 * @apiParam {String} username 用户名
 * @apiParam {String} password 密码
 * @apiSuccess {Number} status 0
 * @apiSuccess {String} message "登录成功"
 * @apiSuccess {String} token Bearer令牌（有效期10小时）
 * @apiError (Error 400) {Number} status 1
 * @apiError (Error 400) {String} message 用户名或密码错误
 * 
 * 性能优化点：
 * 1. 热点数据缓存：频繁登录用户信息可缓存至Redis（过期时间30分钟）
 * 2. 数据库索引：ev_users表username字段需建立唯一索引，提升查询效率
 * 3. 异步处理：登录日志记录等非核心逻辑采用异步队列处理
 * 
 * 安全增强机制：
 * 1. 异常检测：连续失败3次后要求验证码，5次后临时锁定账号（15分钟）
 * 2. Token安全：采用HS256算法签名，包含用户ID等必要信息（最小权限原则）
 * 3. 传输安全：生产环境强制HTTPS，防止Token在传输过程中被窃听
 */
router.post('/login', 
  expressJoi(reg_login_schema), 
  userHandler.login
);

// 导出路由模块
// 挂载说明：在应用入口通过app.use('/api', userRouter)挂载
// 扩展性设计：
// 1. 可添加路由级中间件实现模块专属功能（如：router.use(logMiddleware)记录认证日志）
// 2. 支持通过环境变量动态调整路由前缀，适应多环境部署
// 3. 预留路由钩子，便于接入APM（应用性能监控）工具
module.exports = router;